
#include <stdio.h>

#include "ParseTS_Length.h"
#include "TsParser.h"

#define PACKET_LENGTH_188 188
#define PACKET_LENGTH_204 204

/**
 * @brief 解析TS包的长度 188 or 204
 * @param {FILE} *tsFile ts文件指针
 * @param {int} *tsPosition ts位置指针
 * @return {-1：失败，成功返回TS包长度}
 */
int parseTsLength(FILE *tsFile, int *tsPosition)
{
	int firstPackageByte = 0; // 第一个包的字节
	while (!feof(tsFile))
	{
		firstPackageByte = fgetc(tsFile);
		if (0x47 == firstPackageByte)
		{
			if (PACKET_LENGTH_188 == matchPackageTenTimes(tsFile, *tsPosition, PACKET_LENGTH_188))
			{
				return PACKET_LENGTH_188;
			}
			if (PACKET_LENGTH_204 == matchPackageTenTimes(tsFile, *tsPosition, PACKET_LENGTH_204))
			{
				return PACKET_LENGTH_204;
			}
		}
		(*tsPosition)++;

		if (-1 == fseek(tsFile, *tsPosition, SEEK_SET))
		{
			DUBUGPRINTF("fseek()时 文件错误\n");
			return -1;
		}
	}
	DUBUGPRINTF("该文件不是TS文件\n");
	return -1;
}

/**
 * @brief 检查包10次，每次检查后，把指针往后到TS长度大小的位置，判断是否为 0x47
 * @param {FILE} *tsFile ts文件指针
 * @param {int} tsPosition ts位置
 * @param {int} tsLength ts长度 188 or 204
 * @return {-1：失败，成功返回TS长度}
 */
int matchPackageTenTimes(FILE *tsFile, int tsPosition, int tsLength)
{
	int iLoopTime = 0;
	int firstPackageByte = 0;

	if (-1 == fseek(tsFile, tsPosition + 1, SEEK_SET))
	{
		return -1;
	}

	for (iLoopTime = 0; iLoopTime < 10; iLoopTime++)
	{
		// 把TS文件从当前位置 指针移到TS包长度-1的位置，看看是不是0x47
		if (-1 == fseek(tsFile, tsLength - 1, SEEK_CUR))
		{
			return -1;
		}
		// 如果文件结束了，
		if (feof(tsFile))
		{
			return -1;
		}
		firstPackageByte = fgetc(tsFile);
		if (0x47 != firstPackageByte)
		{
			return -1;
		}
	}
	return tsLength;
}